package com.xcw.utils;



import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

public class ValidateUtil {
    // 用于检验手机的正则表达式
    public static final String PHONE_REGEX = "^([1][3-9])\\d{9}$";
    public static final String PWD_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$";

    /**
     * 验证手机格式是否合法
     *
     * @param phone
     * @return
     */
    public static boolean checkPhone(String phone) {
        return Pattern.matches(PHONE_REGEX, phone);
    }

    /**
     * 验证密码格式是否合法
     *
     * @param password
     * @return
     */
    public static boolean checkPwd(String password) {
        return Pattern.matches(PWD_REGEX, password);
    }

    /**
     * 验证字符串是否为空
     *
     * @param value
     * @return
     */
    public static boolean isBlank(String value) {
        if (value == null || value.trim().length() == 0) {
            return true;
        }
        return false;
    }

    /**
     * Object[]是否为空
     *
     * @param array
     * @return
     */
    public static boolean isEmpty(Object[] array) {
        if (array == null) {
            return true;
        }

        if (array.length <= 0) {
            return true;
        }

        return false;
    }

    /**
     * 数组是否为空
     *
     * @param collection
     * @return
     */
    public static boolean isEmpty(Collection<?> collection) {
        if (collection == null) {
            return true;
        }
        if (collection.size() <= 0) {
            return true;
        }
        return false;
    }



    /**
     * map是否为空
     *
     * @param map
     * @return
     */
    public static boolean isEmpty(Map map) {
        if (map == null) {
            return true;
        }

        if (map.size() <= 0) {
            return true;
        }

        return false;
    }

    /**
     * 验证是否是url
     *
     * @param url
     * @return
     */
    public static boolean isUrl(String url) {
        if (isBlank(url)) {
            return false;
        }

        final String REG_URL = "^(http|https|ftp)\\://([a-zA-Z0-9\\.\\-]+(\\:[a-zA-Z0-9\\.&%\\$\\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\.[a-zA-Z]{2,4})(\\:[0-9]+)?(/[^/][a-zA-Z0-9\\.\\,\\?\\'\\\\/\\+&%\\$\\=~_\\-@]*)*$";

        if (!url.matches(REG_URL)) {
            return false;
        }

        return true;
    }

    public static boolean contain(String s, String[] args) {
        if (args == null || s == null) {
            return false;
        }

        for (String arg : args) {
            if (s.indexOf(arg) >= 0) {
                return true;
            }
        }

        return false;
    }

    /**
     * 是否是數字
     *
     * @param str
     * @return
     */
    public static boolean isNumeric(String str) {
        if (ValidateUtil.isBlank(str)) {
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    public static boolean isNumber1(String str) {// 判断整型
        return str.matches("^\\d+$$");
    }

    public static boolean isNumber2(String str) {// 判断小数，与判断整型的区别在与d后面的小数点（红色）
        return str.matches("\\d+\\.\\d+$");
    }

    public static boolean isNumber3(String str) {// 判断小数点开头
        return str.matches("\\.\\d+$");
    }

    /**
     * 获取字符串的长度，如果有中文，则每个中文字符计为2位
     *
     * @param value 指定的字符串
     * @return 字符串的长度
     */
    public static int StringLength(String value) {
        int valueLength = 0;
        String chinese = "[\u0391-\uFFE5]";
        /* 获取字段值的长度，如果含中文字符，则每个中文字符长度为2，否则为1 */
        for (int i = 0; i < value.length(); i++) {
            /* 获取一个字符 */
            String temp = value.substring(i, i + 1);
            /* 判断是否为中文字符 */
            if (temp.matches(chinese)) {
                /* 中文字符长度为2 */
                valueLength += 2;
            } else {
                /* 其他字符长度为1 */
                valueLength += 1;
            }
        }
        return valueLength;
    }

    /**
     * 阿拉伯数字转换成汉字
     *
     * @param intInput
     * @return
     */
    public static String ToCH(int intInput) {
        String si = String.valueOf(intInput);
        String sd = "";
        if (si.length() == 1) // 個
        {
            sd += GetCH(intInput);
            return sd;
        } else if (si.length() == 2)// 十
        {
            if (si.substring(0, 1).equals("1")) {
                sd += "十";
            } else {
                sd += (GetCH(intInput / 10) + "十");
                sd += ToCH(intInput % 10);
            }

        } else if (si.length() == 3)// 百
        {
            sd += (GetCH(intInput / 100) + "百");
            if (String.valueOf(intInput % 100).length() < 2){
                sd += "零";
            }
            sd += ToCH(intInput % 100);
        } else if (si.length() == 4)// 千
        {
            sd += (GetCH(intInput / 1000) + "千");
            if (String.valueOf(intInput % 1000).length() < 3){
                sd += "零";
            }
            sd += ToCH(intInput % 1000);
        } else if (si.length() == 5)// 萬
        {
            sd += (GetCH(intInput / 10000) + "万");
            if (String.valueOf(intInput % 10000).length() < 4){
                sd += "零";
            }

            sd += ToCH(intInput % 10000);
        }

        return sd;
    }

    private static String GetCH(int input) {
        String sd = "";
        switch (input) {
            case 1:
                sd = "一";
                break;
            case 2:
                sd = "二";
                break;
            case 3:
                sd = "三";
                break;
            case 4:
                sd = "四";
                break;
            case 5:
                sd = "五";
                break;
            case 6:
                sd = "六";
                break;
            case 7:
                sd = "七";
                break;
            case 8:
                sd = "八";
                break;
            case 9:
                sd = "九";
                break;
            default:
                break;
        }
        return sd;
    }

    /**
     * list转String
     *
     * @param list
     * @param separator
     * @return
     */
    public static String listToString(List list, String separator) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            if (i == list.size() - 1) {
                sb.append(list.get(i));
            } else {
                sb.append(list.get(i));
                sb.append(separator);
            }
        }
        return sb.toString();
    }

    public static String subString(String str, String strStart, String strEnd) {

        /* 找出指定的2个字符在 该字符串里面的 位置 */
        int strStartIndex = str.indexOf(strStart);
        int strEndIndex = str.indexOf(strEnd);

        /* index 为负数 即表示该字符串中 没有该字符 */
        if (strStartIndex < 0) {
            return "字符串 :---->" + str + "<---- 中不存在 " + strStart + ", 无法截取目标字符串";
        }
        if (strEndIndex < 0) {
            return "字符串 :---->" + str + "<---- 中不存在 " + strEnd + ", 无法截取目标字符串";
        }
        /* 开始截取 */
        String result = str.substring(strStartIndex, strEndIndex).substring(strStart.length());
        return result;
    }

}